#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
int n,m,L,V,p[maxn],ans;
double bb[maxn];
struct node{
    int di,vi,ai;
}a[maxn];
struct Node{
    double l,r,opo;
}b[maxn];
struct NODE{
    int bxb,si;
}c[maxn];
bool cmp(node x,node y){
    return x.di<y.di;
}
bool cmp2(NODE x,NODE y){
    return x.si<y.si;
}
vector <int> mat[3005];
int main(){
    freopen("detect.in","r",stdin);
	freopen("detect.out","w",stdout);
    int T;
    T=read();
    while(T--){
        int flag=0,Flag=0;
        n=read(),m=read(),L=read(),V=read();
        for(int i=1;i<=n;i++){
            a[i].di=read(),a[i].vi=read(),a[i].ai=read();
            if(a[i].ai!=0){
                flag=1;
            }
            if(a[i].ai<=0){
                Flag=1;
            }
        }
        for(int i=1;i<=m;i++){
            p[i]=read();
        }
        ans=0;
        if(flag==0){
            sort(a+1,a+n+1,cmp);
            for(int i=1;i<=n;i++){
                if(a[i].di<=p[m]&&a[i].vi>V){
                    ans++;
                }
            }
            printf("%d ",ans);
            printf("%d\n",m-1);
        }else if(Flag==0){
            int k=0;
            for(int i=1;i<=n;i++){
                if(a[i].vi>=V){
                    if(a[i].vi>=V){
                        bb[++k]=a[i].di;
                        if(bb[k]==15) bb[k]-=0.01;
                    }
                }else{
                    double x=(V-a[i].vi)*(V-a[i].vi)*1.00/2/a[i].ai*1.00;
                    if(a[i].di+x<=L){
                        bb[++k]=a[i].di+x;
                        if(bb[k]==15) bb[k]-=0.01;
                    }
                }
            }
            sort(bb+1,bb+k+1);
            for(int i=k;i>=1;i--){
                if(p[m]>=bb[i]){
                    ans=i;
                    break;
                }
            }
            printf("%d ",ans);
            printf("%d\n",m-1); 
        }else{
            int k=0;
            for(int i=1;i<=n;i++){
                if(a[i].ai<0){
                    if(a[i].vi<V) continue;
                    else if(a[i].vi==V){
                        b[++k].l=a[i].di;
                        b[k].r=a[i].di;
                    }else{
                        double x=(a[i].vi-V)*(a[i].vi-V)*1.00/2/abs(a[i].ai);
                        if(a[i].di+x>=L){
                            b[++k].l=a[i].di;
                            b[k].r=L-0.01;
                        }else{
                            b[++k].l=a[i].di;
                            b[k].r=a[i].di+x;
                        }
                    }
                }else if(a[i].ai>0){
                    if(a[i].vi>=V){
                        if(a[i].vi>=V){
                            b[++k].l=a[i].di;
                            b[k].r=L-0.01;
                        }
                    }else{
                        double x=(V-a[i].vi)*(V-a[i].vi)*1.00/2/a[i].ai;
                        if(a[i].di+x<=L){
                            b[++k].l=a[i].di+x;
                            b[k].r=L-0.01;
                        }
                    }
                }else{
                    if(a[i].vi>=V){
                        b[++k].l=a[i].di;
                        b[k].r=L-0.01;
                    }
                }
            }
            for(int i=1;i<=m;i++){
                for(int j=1;j<=k;j++){
                    if(p[i]>=b[j].l&&p[i]<=b[j].r&&b[j].opo==0){
                        ans++;
                        b[j].opo=1;
                        mat[i].push_back(j);
                    }
                }
            }
            printf("%d ",ans);
            int ansn=0;
            int u=0;
            for(int i=1;i<=m;i++){
                if(mat[i].size()==0){
                    ansn++;
                }else{
                    c[++u].bxb=i;
                    c[u].si=mat[i].size();
                }
            }
            sort(c+1,c+u+1,cmp2);
            
            for(int i=1;i<=u;i++){
                int ttm=c[i].bxb;
                bool ttt=true;
                int oou=mat[ttm].size();
                for(int j=0;j<oou;j++){
                    int v=mat[ttm][j];
                    if(mat[v].size()<=1){
                        ttt=false;
                        break;
                    }else{
                        mat[ttm].erase(mat[ttm].begin());
                    }
                }
                if(ttt==true){
                    ansn++;
                }
            }
            printf("%d\n",ansn);
        }
        
    }
    return 0;
}
